﻿using System;
using System.Collections.Generic;
using System.Text;

namespace GeoAPI.CoordinateSystems.Transformations
{
    public interface ICoordinateTransformation
    {
        /// <summary>
        /// Human readable description of domain in source coordinate system.
        /// </summary>
        String AreaOfUse { get; }

        /// <summary>
        /// Authority which defined transformation and parameter values.
        /// </summary>
        /// <remarks>
        /// An Authority is an organization that maintains definitions of Authority Codes. 
        /// For example the European Petroleum Survey Group (EPSG) maintains a database of 
        /// coordinate systems, and other spatial referencing objects, where each object has 
        /// a code number ID. For example, the EPSG code for a WGS84 Lat / Lon coordinate system is ‘4326’
        /// </remarks>
        String Authority { get; }

        /// <summary>
        /// Code used by authority to identify transformation. 
        /// An empty string is used for no code.
        /// </summary>
        /// <remarks>The AuthorityCode is a compact String defined by an Authority to reference 
        /// a particular spatial reference object. For example, the European Survey Group (EPSG) 
        /// authority uses 32 bit integers to reference coordinate systems, so all their code strings 
        /// will consist of a few digits. The EPSG code for WGS84 Lat / Lon is ‘4326’.</remarks>
        Int64 AuthorityCode { get; }

        /// <summary>
        /// Gets math transform.
        /// </summary>
        IMathTransform MathTransform { get; }

        /// <summary>
        /// Source coordinate system.
        /// </summary>
        ICoordinateSystem Source { get; }

        /// <summary>
        /// Target coordinate system.
        /// </summary>
        ICoordinateSystem Target { get; }

        /// <summary>
        /// Name of transformation.
        /// </summary>
        String Name { get; }

        /// <summary>
        /// Gets the provider-supplied remarks.
        /// </summary>
        String Remarks { get; }

        /// <summary>
        /// Semantic type of transform. For example, a datum transformation or a coordinate conversion.
        /// </summary>
        TransformType TransformType { get; }
    }
}
